﻿using System;
using GestorDeFlotasDesktop.Listados;
using System.Windows.Forms;
using Controllers;
namespace GestorDeFlotasDesktop
{
    public partial class AbmReloj : Form
    {

        #region Inicializador

        public AbmReloj()
        {
            InitializeComponent();
        }

        #endregion

        #region Propiedades

        public lstRelojes parentForm { get; set; }
        public Reloj reloj { get; set; }
        public MarcaReloj marca { get; set; }
        public ModeloReloj modelo { get; set; }
        public Operacion operacion { get; set; }
        private bool valido = true;

        #endregion

        #region Eventos

        private void AbmReloj_Load(object sender, EventArgs e)
        {
            CargarMarcas();
            if (operacion == Operacion.Alta)
            {
                chkHabilitado.Checked = true;
                lblOperacion.Text = "Nuevo";
            }
            else
            {
                CargarForm();
                if (operacion == Operacion.Baja)
                {
                    InhabilitarForm();
                    lblOperacion.Text = "Eliminar";
                    btnLimpiar.Enabled = false;
                }
                else
                {
                    lblOperacion.Text = "Modificar";
                }

            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {

            if (operacion == Operacion.Baja)
            {
                if(AutoController.ExisteElReloj(reloj.Reloj_Id,null))
                {
                    DialogResult result = MessageBox.Show("El reloj se encuentra asociado a un Taxi. Seguro que desea eliminarlo?", "Confirmación Baja de Reloj", MessageBoxButtons.YesNo);

                    if (result == DialogResult.No)
                    {
                        this.Close();
                        return;
                    }
                }
                
                RelojController.Eliminar(reloj.Reloj_Id);
                MessageBox.Show("El reloj fue eliminado con éxito");
                if (parentForm != null) parentForm.ActualizarGrilla();
                Close();
            }
            else
            {

                ValidarForm(sender, e);
                if (valido)
                {
                    if (operacion == Operacion.Alta)
                    {
                        reloj = CargarObjeto();
                        RelojController.Agregar(reloj);
                        MessageBox.Show("El reloj fue dado de alta con éxito");
                    }
                    else if (operacion == Operacion.Modificacion)
                    {
                        reloj = CargarObjeto();
                        if (reloj.Reloj_Habilitado == false && AutoController.ExisteElReloj(reloj.Reloj_Id, null))
                        {
                            DialogResult result = MessageBox.Show("El reloj se encuentra asociado a un Taxi. Seguro que desea deshabilitarlo?", "Confirmación Deshabilitacion de Reloj", MessageBoxButtons.YesNo);

                            if (result == DialogResult.No)
                            {
                                this.Close();
                                return;
                            }
                        }
                        RelojController.Modificar(reloj);
                        MessageBox.Show("El reloj fue modificado con éxito");
                    }

                    LimpiarForm();
                    reloj = null;
                    if (parentForm != null) parentForm.ActualizarGrilla();
                    Close();
                }
                valido = true;
            }



        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            LimpiarForm();
        }

        #endregion

        #region Metodos del Form

        private Reloj CargarObjeto()
        {
            if (reloj == null) reloj = new Reloj();
            if (marca == null) marca = new MarcaReloj();
            if (modelo == null) modelo = new ModeloReloj();
            marca.MaRe_Id = ((MarcaReloj)cboMarca.SelectedItem).MaRe_Id;
            modelo.MoRe_Marca = marca;
            modelo.MoRe_Id = ((ModeloReloj)cboModelo.SelectedItem).MoRe_Id;
            reloj.Reloj_Modelo = modelo;
            reloj.Reloj_NumeroSerie = txtNroSerie.Text;
            reloj.Reloj_Fecha_Ver = dtpVerificacion.Value;
            reloj.Reloj_Habilitado = chkHabilitado.Checked;

            return reloj;
        }

        private void CargarMarcas()
        {
            cboMarca.DataSource = RelojController.ObtenerMarcas(0);
            cboMarca.DisplayMember = "MaRe_Nombre";
            cboMarca.ValueMember = "MaRe_Id";
        }

        private void CargarModelos(int marcaId)
        {
            cboModelo.DataSource = RelojController.ObtenerModelos(marcaId);
            cboModelo.DisplayMember = "MoRe_Nombre";
            cboModelo.ValueMember = "MoRe_Id";
        }


        private void CargarForm()
        {
            cboMarca.SelectedValue = reloj.Reloj_Modelo.MoRe_Marca.MaRe_Id;
            cboModelo.SelectedValue = reloj.Reloj_Modelo.MoRe_Id;
            txtNroSerie.Text = reloj.Reloj_NumeroSerie;
            dtpVerificacion.Value = reloj.Reloj_Fecha_Ver;
            chkHabilitado.Checked = reloj.Reloj_Habilitado;
        }

        private void LimpiarForm()
        {
            cboMarca.SelectedValue = 0;
            cboModelo.SelectedValue = 0;
            txtNroSerie.Text = "";
            dtpVerificacion.Value = DateTime.Today;
            chkHabilitado.Checked = true;
        }

        private void InhabilitarForm()
        {
            cboMarca.Enabled = false;
            cboModelo.Enabled = false;
            txtNroSerie.Enabled = false;
            dtpVerificacion.Enabled = false;
            chkHabilitado.Enabled = false;
        }

        #endregion

        #region Validaciones


        private void ValidarForm(object sender, EventArgs e)
        {
            valido = true;
            cboMarca_Validated(sender, e);
            cboModelo_Validated(sender, e);
            txtNroSerie_Validated(sender, e);
            dtpVerificacion_Validated(sender, e);
        }

        private void cboMarca_Validated(object sender, EventArgs e)
        {
            if (cboMarca.SelectedValue.Equals(0))
            {
                errProvider.SetError(cboMarca, "Debe seleccionar una marca");
                valido = false;
            }
            else
            {
                errProvider.SetError(cboMarca, "");
            }
        }

        private void cboModelo_Validated(object sender, EventArgs e)
        {
            if (cboModelo.SelectedValue.Equals(0))
            {
                errProvider.SetError(cboModelo, "Debe seleccionar un modelo");
                valido = false;
            }
            else
            {
                errProvider.SetError(cboModelo, "");
            }
        }

        private void txtNroSerie_Validated(object sender, EventArgs e)
        {
            if (txtNroSerie.Text.Length != 18)
            {
                errProvider.SetError(txtNroSerie, "Debe ingresar 18 digitos");
                valido = false;
            }
            else if(RelojController.ExisteElNumeroSerie(txtNroSerie.Text,reloj))
            {
                errProvider.SetError(txtNroSerie, "El Numero de Serie ya existe en otro Reloj");
                valido = false;
            }
            else
            {
                errProvider.SetError(txtNroSerie, "");
            }
        }

        private void dtpVerificacion_Validated(object sender, EventArgs e)
        {
            if (dtpVerificacion.Value > DateTime.Today)
            {
                errProvider.SetError(dtpVerificacion, "La fecha de verificación no puede ser mayor a la de hoy");
                valido = false;
            }
            else
            {
                errProvider.SetError(dtpVerificacion, "");
            }
        }

        #endregion

        private void cboMarca_SelectedIndexChanged(object sender, EventArgs e)
        {
            CargarModelos(((MarcaReloj)cboMarca.SelectedItem).MaRe_Id);
        }


        private void txtNroSerie_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsControl(e.KeyChar)
                && !char.IsDigit(e.KeyChar)
                )
            {
                e.Handled = true;
            }
        }


    }
}
